package com.smart.community.commons.controller;

import com.smart.community.commons.result.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

/**
 * 日期格式转换器测试Controller
 * 
 * 功能说明：
 * 1. 测试Spring Boot日期格式转换器是否生效
 * 2. 验证@RequestParam中的LocalDate、LocalDateTime、LocalTime参数转换
 * 3. 用于验证CommonsAutoConfiguration中的addFormatters配置
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 * @version 1.0.0
 */
@Slf4j
@RestController
@RequestMapping("/test/date")
@Tag(name = "日期格式转换器测试", description = "测试Spring Boot日期格式转换器功能")
public class DateTestController {

    /**
     * 测试LocalDate参数转换
     * 
     * @param date 日期参数
     * @return 测试结果
     */
    @GetMapping("/localdate")
    @Operation(summary = "测试LocalDate参数转换", description = "测试@RequestParam中的LocalDate参数自动转换")
    public Result<String> testLocalDate(
            @Parameter(description = "日期参数，格式：yyyy-MM-dd") @RequestParam LocalDate date) {
        log.info("测试LocalDate参数转换，接收到的日期：{}", date);
        return Result.success("LocalDate参数转换成功，日期：" + date);
    }

    /**
     * 测试LocalDateTime参数转换
     * 
     * @param dateTime 日期时间参数
     * @return 测试结果
     */
    @GetMapping("/localdatetime")
    @Operation(summary = "测试LocalDateTime参数转换", description = "测试@RequestParam中的LocalDateTime参数自动转换")
    public Result<String> testLocalDateTime(
            @Parameter(description = "日期时间参数，格式：yyyy-MM-dd HH:mm:ss") @RequestParam LocalDateTime dateTime) {
        log.info("测试LocalDateTime参数转换，接收到的日期时间：{}", dateTime);
        return Result.success("LocalDateTime参数转换成功，日期时间：" + dateTime);
    }

    /**
     * 测试LocalTime参数转换
     * 
     * @param time 时间参数
     * @return 测试结果
     */
    @GetMapping("/localtime")
    @Operation(summary = "测试LocalTime参数转换", description = "测试@RequestParam中的LocalTime参数自动转换")
    public Result<String> testLocalTime(
            @Parameter(description = "时间参数，格式：HH:mm:ss") @RequestParam LocalTime time) {
        log.info("测试LocalTime参数转换，接收到的时间：{}", time);
        return Result.success("LocalTime参数转换成功，时间：" + time);
    }

    /**
     * 测试多个日期参数转换
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 测试结果
     */
    @GetMapping("/multiple")
    @Operation(summary = "测试多个日期参数转换", description = "测试多个日期时间参数的自动转换")
    public Result<String> testMultipleDateParams(
            @Parameter(description = "开始日期，格式：yyyy-MM-dd") @RequestParam LocalDate startDate,
            @Parameter(description = "结束日期，格式：yyyy-MM-dd") @RequestParam LocalDate endDate,
            @Parameter(description = "开始时间，格式：HH:mm:ss") @RequestParam LocalTime startTime,
            @Parameter(description = "结束时间，格式：HH:mm:ss") @RequestParam LocalTime endTime) {
        log.info("测试多个日期参数转换，开始日期：{}，结束日期：{}，开始时间：{}，结束时间：{}", 
                startDate, endDate, startTime, endTime);
        return Result.success("多个日期参数转换成功，开始日期：" + startDate + "，结束日期：" + endDate + 
                "，开始时间：" + startTime + "，结束时间：" + endTime);
    }

    /**
     * 测试可选日期参数转换
     * 
     * @param date 可选日期参数
     * @return 测试结果
     */
    @GetMapping("/optional")
    @Operation(summary = "测试可选日期参数转换", description = "测试可选的LocalDate参数自动转换")
    public Result<String> testOptionalDate(
            @Parameter(description = "可选日期参数，格式：yyyy-MM-dd") @RequestParam(required = false) LocalDate date) {
        log.info("测试可选日期参数转换，接收到的日期：{}", date);
        return Result.success("可选日期参数转换成功，日期：" + (date != null ? date.toString() : "null"));
    }
}
